from info import db
from datetime import datetime
import uuid

# t_user自连接表
t_user_fans = db.Table(
    't_user_fans',
    db.Column('concern_id',db.Integer,                                 # 被关注的人
              db.ForeignKey('t_user.id',ondelete='set null')),
    db.Column('fans_id',                                               # 被关注人的粉丝
              db.Integer,db.ForeignKey('t_user.id',ondelete='set null')),
)

# 用户收藏新闻
t_user_news_collections = db.Table(
    't_user_news_collections',
    db.Column('user_id',                                                # 收藏者
              db.Integer,db.ForeignKey('t_user.id',ondelete='cascade')),
    db.Column('news_id',                                                # 收藏的新闻id
              db.Integer,db.ForeignKey('t_news.id',ondelete='cascade')),
)

# # 用户点赞评论

t_user_comment_like = db.Table(
    't_user_comment_like',
    db.Column('user_id',                                                   # 点赞者
             db.Integer,db.ForeignKey('t_user.id',ondelete='cascade')),
    db.Column('content_id',                                                # 被点赞的帖子
             db.Integer,db.ForeignKey('t_comment.id',ondelete='cascade')),
)

class User(db.Model):
    __tablename__ = 't_user'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    uid = db.Column(                                                       # 用户定位用户首页
        db.String(36),default=uuid.uuid4().__str__(),nullable=False,unique=True,index=True)

    tel = db.Column(db.String(11),nullable=False,unique=True)              # 用户登录的手机号
    username = db.Column(db.String(15),default=tel)                         # 用户昵称，可以重复，注册时默认是手机号
    password = db.Column(db.String(32),nullable=False)                      # md5方式加密的密码
    gender = db.Column(db.Boolean,default=0,nullable=False)                 # 性别，默认0，表示男，1表示女
    signature = db.Column(db.String(50))                                    # 个性签名，默认是null
    image_url = db.Column(db.String(100))                                   # 用户头像，默认是null
    createDatetime = db.Column(db.DateTime,default=datetime.now())          # 创建用户的时间，默认是当前时间
    lastLoginDatetime = db.Column(db.DateTime,default=datetime.now())       # 上一次登录的时间，默认是当前时间
    fan_s = db.relationship(                                                # 得到该用户的粉丝
        'User',                                                             # 自关联自己，User类
        primaryjoin=id == t_user_fans.c.concern_id,                         # 因为是得到fans所有指向concern_id
        secondaryjoin=id == t_user_fans.c.fans_id,                          # 多的一方式fans_id
        secondary='t_user_fans',                                            # 多对多关系表
        backref=db.backref('concern_s',lazy='dynamic'),                     # 反向引用，且懒加载
        lazy = 'dynamic',                                                   # 正向引用，懒加载
    )

    release_new_s = db.relationship(                                        # 发布的新闻
        'News',                                                             # 关联News类
        backref = 'release_user',                                           # 反向引用，得到新闻的发布者，无懒加载
        lazy='dynamic'                                                      # 正向引用，懒加载
    )

    collection_s = db.relationship(                                         # 得到用户收藏的新闻
        'News',                                                             # 关联News类
        backref = db.backref('collection_user',lazy='dynamic'),             # 反向引用,通过collection_user得到收藏者，反向懒加载
        secondary = 't_user_news_collections',                              # 多对多表
        lazy = 'dynamic',                                                   # 正向懒加载
    )

    like_comment = db.relationship(                                         # 得到用户点赞的评论
        'Comment',                                                          # 关联Comment类
        backref = db.backref('like_user',lazy='dynamic'),                   # 反向通过like_user，得到点赞者
        secondary='t_user_comment_like',                                    # 多对多表
        lazy = 'dynamic',                                                   # 正向引用懒加载
    )

# 新闻类
class News(db.Model):
    __tablename__ = 't_news'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(25),nullable=False,unique=True)             # 标题，不能为null，且唯一，标题最大长度25
    summary = db.Column(db.String(50),nullable=False)                       # 摘要，不能为null，可以重复，最大长度50
    image_url = db.Column(db.String(100))                                   # 新闻图片的url，默认是null
    body = db.Column(db.String(2000),nullable=False)                        # 正文，最大长度2000，不能为空
    createDatetime = db.Column(db.DateTime,default=datetime.now())          # 创建的时间，默认是当前时间
    visited_num = db.Column(db.Integer,default=0,nullable=False)            # 访问的次数，默认是0，不可以为null
    status = db.Column(db.Integer,default=0)                                # 状态，0：审查中；1：审查成功；-1：审查失败，默认是0
    user_id = db.Column(db.Integer,db.                                      # 引用user_id,通过release_user得到发送方
                        ForeignKey('t_user.id',ondelete='set null'))
    category_id = db.Column(db.Integer,                                     # 引用category_id,通过category得到新闻分类 #todo
                            db.ForeignKey('t_category.id',ondelete='set null'))

    comment_s = db.relationship(                                            # 得到新闻的评论
        'Comment',                                                          # 关联Comment类
        backref = 'news',                                                   # 反向引用news
        lazy = 'dynamic',                                                   # 正向懒加载
    )

# 新闻种类表
class Category(db.Model):
    __tablename__ = 't_category'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    category = db.Column(db.String(10),nullable=False,unique=True)          # 新闻种类，不可以为空，且唯一
    news_s = db.relationship(                                               # 得到种类下的所有新闻
        'News',
        backref = 'category',                                                   # 反向引用category
        lazy = 'dynamic',                                                       # 懒加载
    )


# 新闻评论表
class Comment(db.Model):
    __tablename__ = 't_comment'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    content = db.Column(db.String(100),nullable=False)                      # 评论内容不能为空
    createDatetime = db.Column(db.DateTime,default=datetime.now())          # 创建时间默认是当前时间
    like_num = db.Column(db.Integer,default=0,nullable=False)               # 评论被点赞的个数，默认是0，不能为空
    user_id = db.Column(db.Integer,                                         # 得到评论的用户
                        db.ForeignKey('t_user.id',ondelete='set null'))
    news_id = db.Column(db.Integer,                                         # 得到被评论的新闻
                        db.ForeignKey('t_news.id',ondelete='set null'))
    comment_id = db.Column(db.Integer,default=None)                         # 自连接，自己维护，默认是0，表示评论的是新闻
                                                                            # 如果不为0，则为t_comment.id #todo



class Admin(db.Model):
    __tablename__ = 't_admin'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    tel = db.Column(db.String(11),nullable=False,unique=True)                  # 用户登录的账号，不一定是手机号
    username = db.Column(db.String(15),default=tel,nullable=False)             # 管理员你昵称，默认是手机号
    password = db.Column(db.String(32),nullable=False)                      # md5加密的密码




